package main

import (
	"chat-room-gen/aa"
	"gorm.io/driver/mysql"
	"gorm.io/gen"
	"gorm.io/gorm"
	"time"
)

type Query interface {
	// SELECT * FROM @@table WHERE id in @ids
	GetByIDD(ids ...int32) (gen.T, error)
	// SELECT * FROM @@table WHERE id in @ids
	GetByIDDs(ids ...int32) ([]gen.T, error)
	// SELECT * FROM @@table WHERE id in @ids
	GetByIDD1(ids ...int32) (*gen.T, error)
	// SELECT * FROM @@table WHERE id in @ids
	GetByIDDs1(ids ...int32) ([]*gen.T, error)
	// SELECT * FROM users WHERE
	//  {{if name !=""}}
	//      username=@name AND
	//  {{end}}
	//  {{if name1 !=""}}
	//      username=@name1 AND
	//  {{end}}
	//  role="admin"
	GetByIDDs11(name, name1 string) ([]*gen.T, error)

	// SELECT * FROM @@table
	//  {{where}}
	//    {{if !start.IsZero()}}
	//      created_time > @start
	//    {{end}}
	//    {{if !end.IsZero()}}
	//      AND created_time < @end
	//    {{end}}
	//  {{end}}
	FilterWithTime(start, end time.Time) ([]gen.T, error)
}

func main() {
	conf := gen.Config{
		//OutPath: "../query",
		// 相对执行`go run`时的路径, 会自动创建目录
		OutPath: "./query",

		// WithDefaultQuery 生成默认查询结构体(作为全局变量使用), 即`Q`结构体和其字段(各表模型)
		// WithoutContext 生成没有context调用限制的代码供查询
		// WithQueryInterface 生成interface形式的查询代码(可导出), 如`Where()`方法返回的就是一个可导出的接口类型
		Mode: gen.WithDefaultQuery | gen.WithQueryInterface | gen.WithoutContext,

		// 表字段可为 null 值时, 对应结体字段使用指针类型
		FieldNullable: true, // generate pointer when field is nullable

		// 表字段默认值与模型结构体字段零值不一致的字段, 在插入数据时需要赋值该字段值为零值的, 结构体字段须是指针类型才能成功, 即`FieldCoverable:true`配置下生成的结构体字段.
		// 因为在插入时遇到字段为零值的会被GORM赋予默认值. 如字段`age`表默认值为10, 即使你显式设置为0最后也会被GORM设为10提交.
		// 如果该字段没有上面提到的插入时赋零值的特殊需要, 则字段为非指针类型使用起来会比较方便.
		FieldCoverable: false, // generate pointer when field has default value, to fix problem zero value cannot be assign: https://gorm.io/docs/create.html#Default-Values

		// 模型结构体字段的数字类型的符号表示是否与表字段的一致, `false`指示都用有符号类型
		FieldSignable: false, // detect integer field's unsigned type, adjust generated data type
		// 生成 gorm 标签的字段索引属性
		FieldWithIndexTag: false, // generate with gorm index tag
		// 生成 gorm 标签的字段类型属性
		FieldWithTypeTag: true, // generate with gorm column type tag

	}
	g := gen.NewGenerator(conf)

	gormdb, _ := gorm.Open(mysql.Open("blue7:123456@tcp(127.0.0.1:3306)/ws?charset=utf8mb4&parseTime=True&loc=Local"))
	g.UseDB(gormdb) // reuse your gorm db

	// Generate basic type-safe DAO API for struct `model.User` following conventions

	//g.ApplyBasic(
	//	// Generate struct `User` based on table `users`
	//	g.GenerateModel("users"),
	//
	//	// Generate struct `Employee` based on table `users`
	//	g.GenerateModelAs("users", "Employee"),
	//
	//	// Generate struct `User` based on table `users` and generating options
	//	g.GenerateModel("users", gen.FieldIgnore("address"), gen.FieldType("id", "int64")),
	//)
	//g.ApplyBasic(
	//	// Generate structs from all tables of current database
	//	g.GenerateAllTable()...,
	//)

	// todo
	// 自定义sql查询并生成到指定到结构体中，实际上这个结构体用处不大，生成到sql方法实现还需要自行处理一下才能用，
	// 因为 联合查询的时候不一定只有一个表，所以这里的映射结构体实际上是该接口中的所有的接口方法都会返回该结构体
	// 所以不适用，还需要修改，你想想接口中有很多方法，每个方法返回值肯定不一样，还有的是更新有的是插入，
	// 目前的自定义sql只适合单表生成
	g.ApplyInterface(func(query Query) {}, aa.Address1{})
	// Generate the code
	g.Execute()

}
